package compiler.node;

import compiler.Symbol;
import compiler.SymbolTable;
import org.antlr.runtime.Token;

import java.util.Stack;
/*

    This file is part of Logica-Logike.

    Logica-Logike is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation version 3 of the License.

    Logica-Logike is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with Logica-Logike.  If not, see <http://www.gnu.org/licenses/>.

 */
public class Variable extends Node {

    private Symbol symbol;
    private SymbolTable table;

    public Variable(Token token) {
        super(token);
    }

    protected void analyze(SymbolTable st) {
        super.analyze(st);
        if (!st.isDeclared(getText())) {
            st.declare(getText());
        }
        symbol = st.getDeclaredSymbol(getText());
        table = st;
    }

    protected void execute(Stack stack) {
        stack.push(calculateArray());
    }

    private boolean[] calculateArray() {
        int arraySize = (int) Math.pow(2, table.getTotalSymbols());
        int interval = symbol.getPosition();
        int change = (int) Math.pow(2, interval) / 2;
        boolean[] solution = new boolean[arraySize];
        boolean valor = true;
        int row = 0;
        for (int i = 0; i < arraySize / change; i++) {
            for (int j = 0; j < change; j++) {
                solution[row] = valor;
                row++;
            }
            valor = !valor;
        }
        return solution;
    }
}
